package com.msi;

import java.util.ArrayList;
import java.util.List;

import org.junit.*;
import static org.junit.Assert.*;

public class GraphTests {

    @Test
    public void test_createGraphByNeighbourMatrix(){
        List<List<Integer>> matrix = new ArrayList<List<Integer>>();

        // v0
        List<Integer> v0list = new ArrayList<Integer>();
        v0list.add(0);
        v0list.add(1);
        
        // v1
        List<Integer> v1list = new ArrayList<Integer>();
        v1list.add(1);
        v1list.add(0);
        
        // matrix
        matrix.add(v0list);
        matrix.add(v1list);
        
        Graph g = Graph.createGraphByNeighbourMatrix(matrix);
        
        Vertex v0 = g.getVertex(0);
        Vertex v1 = g.getVertex(1);

        assertTrue(v0.getDegree() == 1);
        assertTrue(v1.getDegree() == 1);
        assertTrue(v0.getNeighborhood().size() == 1);
        assertTrue(v1.getNeighborhood().size() == 1);
        assertTrue(v0.getNeighborhood().get(0).equals(v1));
        assertTrue(v1.getNeighborhood().get(0).equals(v0));
    }

    
    
    @Test
    public void test_getNotVisitedVerticesSortedByDegreeAsc(){
        List<List<Integer>> matrix = new ArrayList<List<Integer>>();

        // v0
        List<Integer> v0list = new ArrayList<Integer>();
        v0list.add(0);
        v0list.add(1);
        v0list.add(1);
        v0list.add(1);
        
        // v1
        List<Integer> v1list = new ArrayList<Integer>();
        v1list.add(1);
        v1list.add(0);
        v1list.add(1);
        v1list.add(0);
        
        // v2
        List<Integer> v2list = new ArrayList<Integer>();
        v2list.add(1);
        v2list.add(1);
        v2list.add(0);
        v2list.add(0);
        
        // v3
        List<Integer> v3list = new ArrayList<Integer>();
        v3list.add(1);
        v3list.add(0);
        v3list.add(0);
        v3list.add(0);
        
        // matrix
        matrix.add(v0list);
        matrix.add(v1list);
        matrix.add(v2list);
        matrix.add(v3list);
        
        Graph g = Graph.createGraphByNeighbourMatrix(matrix);
        Vertex v0 = g.getVertex(0);
        Vertex v1 = g.getVertex(1);
        Vertex v2 = g.getVertex(2);
        Vertex v3 = g.getVertex(3);
        
        List<Vertex> notVisitedSortedAsc = g.getNotVisitedVerticesSortedByDegree(true);

        assertTrue(notVisitedSortedAsc.get(0).equals(v3));
        assertTrue(notVisitedSortedAsc.get(1).equals(v1) || notVisitedSortedAsc.get(1).equals(v2));
        assertTrue(notVisitedSortedAsc.get(2).equals(v1) || notVisitedSortedAsc.get(2).equals(v2));
        assertTrue(notVisitedSortedAsc.get(3).equals(v0));
    }

    
    @Test
    public void test_getNotVisitedVerticesSortedByDegreeDesc(){
        List<List<Integer>> matrix = new ArrayList<List<Integer>>();

        // v0
        List<Integer> v0list = new ArrayList<Integer>();
        v0list.add(0);
        v0list.add(1);
        v0list.add(1);
        v0list.add(1);
        
        // v1
        List<Integer> v1list = new ArrayList<Integer>();
        v1list.add(1);
        v1list.add(0);
        v1list.add(1);
        v1list.add(0);
        
        // v2
        List<Integer> v2list = new ArrayList<Integer>();
        v2list.add(1);
        v2list.add(1);
        v2list.add(0);
        v2list.add(0);
        
        // v3
        List<Integer> v3list = new ArrayList<Integer>();
        v3list.add(1);
        v3list.add(0);
        v3list.add(0);
        v3list.add(0);
        
        // matrix
        matrix.add(v0list);
        matrix.add(v1list);
        matrix.add(v2list);
        matrix.add(v3list);
        
        Graph g = Graph.createGraphByNeighbourMatrix(matrix);
        Vertex v0 = g.getVertex(0);
        Vertex v1 = g.getVertex(1);
        Vertex v2 = g.getVertex(2);
        Vertex v3 = g.getVertex(3);
        
        List<Vertex> notVisitedSortedAsc = g.getNotVisitedVerticesSortedByDegree(false);

        assertTrue(notVisitedSortedAsc.get(0).equals(v0));
        assertTrue(notVisitedSortedAsc.get(1).equals(v1) || notVisitedSortedAsc.get(1).equals(v2));
        assertTrue(notVisitedSortedAsc.get(2).equals(v1) || notVisitedSortedAsc.get(2).equals(v2));
        assertTrue(notVisitedSortedAsc.get(3).equals(v3));
    }
    
    @Test
    public void test_getDeepCopy(){
        List<List<Integer>> matrix = new ArrayList<List<Integer>>();

        // v0
        List<Integer> v0list = new ArrayList<Integer>();
        v0list.add(0);
        v0list.add(1);
        v0list.add(1);
        v0list.add(1);
        
        // v1
        List<Integer> v1list = new ArrayList<Integer>();
        v1list.add(1);
        v1list.add(0);
        v1list.add(1);
        v1list.add(0);
        
        // v2
        List<Integer> v2list = new ArrayList<Integer>();
        v2list.add(1);
        v2list.add(1);
        v2list.add(0);
        v2list.add(0);
        
        // v3
        List<Integer> v3list = new ArrayList<Integer>();
        v3list.add(1);
        v3list.add(0);
        v3list.add(0);
        v3list.add(0);
        
        // matrix
        matrix.add(v0list);
        matrix.add(v1list);
        matrix.add(v2list);
        matrix.add(v3list);
        
        Graph g = Graph.createGraphByNeighbourMatrix(matrix);
        Vertex v0 = g.getVertex(0);
        Vertex v1 = g.getVertex(1);
        Vertex v2 = g.getVertex(2);
        Vertex v3 = g.getVertex(3);
        
        // kopia
        Graph gCopy = g.getDeepCopy();
        Vertex v0copy = gCopy.getVertex(0);
        Vertex v1copy = gCopy.getVertex(1);
        Vertex v2copy = gCopy.getVertex(2);
        Vertex v3copy = gCopy.getVertex(3);
        
        // sprawdzenie
        assertTrue(v0copy.equals(v0));
        assertFalse(v0copy == v0);
        assertTrue(v1copy.equals(v1));
        assertFalse(v1copy == v1);
        assertTrue(v2copy.equals(v2));
        assertFalse(v2copy == v2);
        assertTrue(v3copy.equals(v3));
        assertFalse(v3copy == v3);

        assertTrue(v0copy.getNeighborhood().size() == v0.getNeighborhood().size());
        assertTrue(v1copy.getNeighborhood().size() == v1.getNeighborhood().size());
        assertTrue(v2copy.getNeighborhood().size() == v2.getNeighborhood().size());
        assertTrue(v3copy.getNeighborhood().size() == v3.getNeighborhood().size());
        
        assertTrue(v3copy.getNeighborhood().get(0).equals(v0copy));
        assertTrue(v3copy.getNeighborhood().get(0) == v0copy);
    }
    
}
